/*
 * FlamingIRC IRC library
 * Copyright (C) 2008 Brian Ortiz & Max Schmeling <http://code.google.com/p/ortzirc>
 * 
 * Based on code copyright (C) 2002 Aaron Hunter <thresher@sharkbite.org>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 * 
 * See the gpl.txt file located in the top-level-directory of
 * the archive of this library for complete text of license.
*/

namespace FlamingIRC
{
    /// <summary>
    /// Whether a mode has been added or removed.
    /// </summary>
    public enum ModeAction : int
    {
        /// <summary>
        /// Mode added
        /// </summary>
        Add = 43, //+

        /// <summary>
        /// Mode removed
        /// </summary>
        Remove = 45 //-
    };

    /// <summary>
    /// The possible user modes.
    /// </summary>
    public enum UserMode : int
    {
        /// <summary>
        /// User is away
        /// </summary>
        Away = 97, //a

        /// <summary>
        /// User will receive server status messages
        /// </summary>
        Wallops = 119, //w

        /// <summary>
        /// User cannot be seen by certain IRC queries
        /// </summary>
        Invisible = 105, //i

        /// <summary>
        /// The user is an IRC operator (IRCOP)
        /// </summary>
        Operator = 111, //o

        /// <summary>
        /// Not used
        /// </summary>
        Restricted = 114, //r

        /// <summary>
        /// User is a channel operator/owner
        /// </summary>
        LocalOperator = 79, //O

        /// <summary>
        /// Marks a user for receipt of server notices
        /// </summary>
        ServerNotices = 115 //s

    };

    /// <summary>
    /// Possible channel modes.
    /// </summary>
    public enum ChannelMode : int
    {
        /// <summary>
        /// The mode 'O' is only used in conjunction with "safe channels" and
        /// SHALL NOT be manipulated by users. Servers use it to give the user
        /// creating the channel the status of "channel creator".
        /// </summary>
        ChannelCreator = 79, //O

        /// <summary>
        /// The mode 'o' is used to toggle the operator status of a channel
        /// member. 
        /// 	
        /// Should include a nick or user mask parameter.
        /// </summary>
        ChannelOperator = 111, //o

        /// <summary>
        /// The mode 'h' is used to toggle the non-standard but common half-operator status of a channel
        /// member. 
        /// 	
        /// Should include a nick or user mask parameter.
        /// </summary>
        HalfChannelOperator = 104, //h

        /// <summary>
        /// The mode 'v' is used to give and take voice privilege to/from a
        /// channel member. Users with this privilege can talk on moderated
        /// channels. 
        /// 	
        /// Should include a nick or user mask parameter.
        /// </summary>
        Voice = 118, //v

        /// <summary>
        /// The channel flag 'a' defines an anonymous channel. This means that
        /// when a message sent to the channel is sent by the server to users,
        /// and the origin is a user, then it MUST be masked. 
        /// 	
        /// No param required.
        /// </summary>
        Anonymous = 97, //a

        /// <summary>
        /// When the channel flag 'i' is set, new members are only accepted if
        /// their mask matches Invite-list or they have been
        /// invited by a channel operator. This flag also restricts the usage of
        /// the INVITE command to channel operators.
        /// 
        /// No param required.
        /// </summary>
        InviteOnly = 105, //i

        /// <summary>
        /// The channel flag 'm' is used to control who may speak on a channel.
        /// When it is set, only channel operators, and members who have been
        /// given the voice privilege may send messages to the channel.
        /// 
        /// No param required.
        /// </summary>
        Moderated = 109, //m

        /// <summary>
        /// When the channel flag 'n' is set, only channel members MAY send
        /// messages to the channel.
        /// 	
        /// No param required
        /// </summary>
        NoOutside = 110, //n

        /// <summary>
        /// The channel flag 'q' is for use by servers only. When set, it
        /// restricts the type of data sent to users about the channel
        /// operations: other user joins, parts and nick changes are not sent.
        /// From a user's point of view, the channel contains only one user.
        /// </summary>
        Quiet = 113, //q

        /// <summary>
        /// The channel flag 'p' is used to mark a channel "private" and the
        /// channel flag 's' to mark a channel "secret". Both properties are
        /// similar and conceal the existence of the channel from other users.
        /// 	
        /// No param required.
        /// </summary>
        Private = 112, //p

        /// <summary>
        /// When a channel is "secret", in addition to the restrictions of Private, the
        /// server will act as if the channel does not exist for queries like the
        /// TOPIC, LIST, NAMES commands. Note that there is one exception to
        /// this rule: servers will correctly reply to the MODE command.
        /// Finally, secret channels are not accounted for in the reply to the
        /// LUSERS command when the mask parameter is specified.
        /// 	
        /// No param required.
        /// </summary>
        Secret = 115, //s

        /// <summary>
        /// The channel flag 'r' is only available on channels which name begins
        /// with the character '!' and MAY only be toggled by the "channel
        /// creator".
        /// 	
        /// No param required.
        /// </summary>
        ServerReop = 114, //r

        /// <summary>
        /// The channel flag 't' is used to restrict the usage of the TOPIC
        /// command to channel operators.
        /// 
        /// No param required.
        /// </summary>
        TopicSettable = 116, //t

        /// <summary>
        /// When a channel key is set (by using the mode 'k'), servers MUST
        /// reject their local users request to join the channel unless this key
        /// is given.
        /// 	
        /// Param is the channel password.
        /// </summary>
        Password = 107, //k

        /// <summary>
        /// A user limit may be set on channels by using the channel flag 'l'.
        /// When the limit is reached, servers MUST forbid their local users to
        /// join the channel.
        /// 	
        /// Param is a whole number indicating the max number of users.
        /// </summary>
        UserLimit = 108, //l

        /// <summary>
        /// When a user requests to join a channel, his local server checks if
        /// the user's address matches any of the ban masks set for the channel.
        /// If a match is found, the user request is denied unless the address
        /// also matches an exception mask set for the channel.
        /// 
        /// Param is a nick or user mask.
        /// </summary>
        Ban = 98, //b


        /// <summary>
        /// An error ocurred.
        /// </summary>
        Exception = 101, //e

        /// <summary>
        /// For channels which have the invite-only flag set, users whose 
        /// address matches an invitation mask set for the channel are 
        /// allowed to join the channel without any invitation.
        /// 
        /// Param is a nick or user mask.
        /// </summary>
        Invitation = 73//I
    };


    /// <summary>
    /// The possible stats message query parameters.
    /// </summary>
    public enum StatsQuery : int
    {
        /// <summary>
        /// A list of server connections.
        /// </summary>
        Connections = 108, //l

        /// <summary>
        /// The usage count for each of command supported
        /// by the server.
        /// </summary>
        CommandUsage = 109, //m

        /// <summary>
        /// The list of IRC operators.
        /// </summary>
        Operators = 111, //o

        /// <summary>
        /// The server uptime.
        /// </summary>
        Uptime = 117, //u
    };

    /// <summary>
    /// All recognized mIRC colors.
    /// </summary>
    public enum MircColor
    {
        White = 0,
        Black = 1,
        Blue = 2,
        Green = 3,
        LightRed = 4,
        Brown = 5,
        Purple = 6,
        Orange = 7,
        Yellow = 8,
        LightGreen = 9,
        Cyan = 10,
        LightCyan = 11,
        LightBlue = 12,
        Pink = 13,
        Grey = 14,
        LightGrey = 15,
        Transparent = 99
    };
}
